home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 25 / CU Amiga Magazine's Super CD-ROM 25 (1998)(EMAP Images)(GB)(Track 1 of 2)[!][issue 1998-08].iso / CUCD / Programming / dclistview / dclistview.e < prev    next >
Text File  |  1998-06-01  |  6KB  |  179 lines

  1. /*
  2.    Name:      dclistview.e
  3.    About:     A listview Plugin that understands double-clicks
  4.    Version:   $VER: dclistview.e 1.4 (2.6.98)
  5.    Author:    Copyright © 1997, 1998 Victor Ducedre
  6.  
  7.    A brief note:  This version has been updated with the use of etaglist.m
  8.    from dev/e/SvensModules.lha.  eGetTagData() is the same as GetTagData()
  9.    from utility.library, but does not require the library.
  10.  
  11. */
  12. OPT MODULE, PREPROCESS
  13.  
  14. MODULE 'gadtools', 'libraries/gadtools', 'devices/inputevent',
  15.        'intuition/gadgetclass', 'intuition/intuition', 'utility/tagitem',
  16.        'tools/EasyGUI', 'tools/textlen', 'tools/ctype', 'exec/nodes',
  17.        'exec/lists', 'sven/support/etaglist'
  18.  
  19. ->define DCLIST to make EasyGUI's gadget list more readable!
  20. EXPORT CONST DCLIST=PLUGIN
  21.  
  22. EXPORT ENUM DCLV_LABEL=$FF000001,            -> [I..]
  23.   DCLV_RELX,                                 -> [I..]
  24.   DCLV_RELY,                                 -> [I..]
  25.   DCLV_LIST,                                 -> [ISG]
  26.   DCLV_CURRENT,                              -> [ISG]
  27.   DCLV_CLICK,                                -> [..G]
  28.   DCLV_TOP,                                  -> [ISG]
  29.   DCLV_DISABLED                              -> [ISG]
  30.  
  31. EXPORT OBJECT dclistview OF plugin PRIVATE
  32.   disabled
  33.   current
  34.   top
  35.   clicked
  36.   gadget:PTR TO gadget
  37.   label
  38.   labelhi
  39.   relx, rely
  40.   execlist
  41.   maxnode
  42.   key
  43.   second1, micros1
  44.   second2, micros2
  45. ENDOBJECT
  46.  
  47. PROC dclistview(tags:PTR TO tagitem) OF dclistview
  48. DEF key,label
  49. -> eGetTagData() is from sven/support/etaglist.  See docs.
  50.   self.label:=      eGetTagData(DCLV_LABEL,     NIL, tags)
  51.   self.relx :=  Max(eGetTagData(DCLV_RELX,        5, tags), 5)
  52.   self.rely :=  Max(eGetTagData(DCLV_RELY,        5, tags), 2)
  53.   self.execlist:=   eGetTagData(DCLV_LIST,      NIL, tags)
  54.   self.maxnode:=    max_node(self.execlist)
  55.   self.current:=Max(eGetTagData(DCLV_CURRENT,   NIL, tags), -1)
  56.   self.top:=    Max(eGetTagData(DCLV_TOP,       NIL, tags),0)
  57.   self.disabled:=   eGetTagData(DCLV_DISABLED,FALSE, tags)
  58.   IF label:=self.label
  59.     self.key:= IF (key:=InStr(label, '_'))<>-1 THEN tolower(label[key+1]) ELSE NIL
  60.     self.key:= IF isalpha(self.key) THEN self.key ELSE NIL
  61.   ENDIF
  62.   self.second1:=NIL
  63.   self.second2:=NIL
  64.   self.micros1:=NIL
  65.   self.micros2:=NIL
  66. ENDPROC
  67.  
  68. PROC end() OF dclistview IS EMPTY
  69.  
  70. PROC min_size(ta,fh) OF dclistview
  71.   self.labelhi:=IF self.label THEN fh+5 ELSE 0
  72. ENDPROC Max(textlen_key(self.label,ta,self.key),self.relx*fh), self.rely*fh+self.labelhi+5
  73.  
  74. PROC will_resize() OF dclistview IS (RESIZEX OR RESIZEY)
  75.  
  76. PROC gtrender(gl,vis,ta,x,y,xs,ys,w) OF dclistview HANDLE
  77.   self.gadget:=CreateGadgetA(LISTVIEW_KIND,gl,
  78.                  [x,y+self.labelhi,xs,ys-self.labelhi,self.label,
  79.                      ta,0,0,vis,NIL]:newgadget,
  80.                  [GTLV_LABELS, self.execlist,
  81.                   GA_DISABLED, self.disabled,
  82.                   IF self.key THEN GT_UNDERSCORE ELSE TAG_IGNORE, "_",
  83.                   GTLV_SHOWSELECTED, NIL,
  84.                   GTLV_SELECTED, self.current,
  85.                   GTLV_TOP, self.top,
  86.                   TAG_DONE])
  87.   IF self.gadget=NIL THEN Raise("dclv")
  88. EXCEPT DO
  89.   ReThrow()
  90. ENDPROC self.gadget
  91.  
  92. PROC message_test(imsg:PTR TO intuimessage,win:PTR TO window) OF dclistview
  93. DEF islist=FALSE
  94. IF ((imsg.class=IDCMP_VANILLAKEY) AND Not(self.disabled)) THEN RETURN (self.key=tolower(imsg.code))
  95. IF (imsg.class=IDCMP_GADGETUP)
  96.   IF islist:= (imsg.iaddress=self.gadget)
  97.     self.second2:=imsg.seconds
  98.     self.micros2:=imsg.micros
  99.   ENDIF
  100. ENDIF
  101. ENDPROC islist
  102.  
  103. PROC message_action(class,qual,code,win:PTR TO window) OF dclistview
  104. DEF newcurrent
  105. SELECT class
  106.   CASE IDCMP_VANILLAKEY
  107.     IF (qual AND (IEQUALIFIER_LSHIFT OR IEQUALIFIER_RSHIFT))
  108.       newcurrent:=Max(self.current-1, 0)
  109.     ELSE
  110.       newcurrent:=Min(self.current+1, self.maxnode)
  111.     ENDIF
  112.     IF newcurrent=self.current THEN RETURN FALSE ELSE self.current:=newcurrent
  113.     self.set(DCLV_CURRENT, self.current)
  114.   CASE IDCMP_GADGETUP
  115.     IF code=self.current
  116.       self.clicked:=(IF self.clicked THEN FALSE ELSE DoubleClick(self.second1,self.micros1,self.second2,self.micros2))
  117.     ELSE
  118.       self.current:=code
  119.     ENDIF
  120. ENDSELECT
  121.   self.second1:=self.second2
  122.   self.micros1:=self.micros2
  123.   self.second2:=NIL
  124.   self.micros2:=NIL
  125. ENDPROC TRUE
  126.  
  127. PROC set(attr, val) OF dclistview
  128. DEF newattr=NIL
  129.   SELECT attr
  130.     CASE DCLV_DISABLED
  131.       IF KickVersion(39)
  132.         IF self.disabled<>val
  133.           self.disabled:=val
  134.           newattr:=NEW [GA_DISABLED, self.disabled, TAG_DONE]
  135.           self.clicked:=FALSE
  136.         ENDIF
  137.       ENDIF
  138.     CASE DCLV_LIST
  139.       self.maxnode:=max_node(val)
  140.       newattr:=NEW [GTLV_LABELS, val, TAG_DONE]
  141.       self.execlist:=val
  142.       self.clicked:=FALSE
  143.     CASE DCLV_TOP
  144.       self.top:=Bounds(val,0,self.maxnode)
  145.       newattr:=NEW [GTLV_TOP, self.top, TAG_DONE]
  146.     CASE DCLV_CURRENT
  147.       self.current:= Bounds(val,-1,self.maxnode)
  148.       newattr:=NEW [GTLV_SELECTED, self.current,
  149.                     IF KickVersion(39) THEN GTLV_MAKEVISIBLE ELSE GTLV_TOP, Max(val,0),
  150.                     TAG_DONE]
  151.       self.clicked:=FALSE
  152.   ENDSELECT
  153.   IF newattr
  154.     IF visible(self) THEN Gt_SetGadgetAttrsA(self.gadget, self.gh.wnd, NIL, newattr)
  155.     FastDisposeList(newattr)
  156.   ENDIF
  157. ENDPROC
  158.  
  159. PROC get(attr) OF dclistview
  160.   SELECT attr
  161.     CASE DCLV_LIST;     RETURN self.execlist, TRUE
  162.     CASE DCLV_CURRENT;  RETURN self.current, TRUE
  163.     CASE DCLV_TOP;      RETURN self.top, TRUE
  164.     CASE DCLV_CLICK;    RETURN self.clicked, TRUE
  165.     CASE DCLV_DISABLED; RETURN self.disabled, TRUE
  166.   ENDSELECT
  167. ENDPROC -1, FALSE
  168.  
  169. PROC visible(self:PTR TO dclistview) IS (self.gadget AND self.gh.wnd)
  170.  
  171. PROC max_node(list:PTR TO lh)
  172. DEF node:PTR TO ln, i=NIL
  173.   IF list>0
  174.     node:=list.head
  175.     WHILE node:=node.succ DO INC i
  176.   ENDIF
  177. ENDPROC i-1
  178.  
  179.